package cn.xingzhe.monster.user.domain.repository;

import cn.xingzhe.monster.user.domain.model.UserModel;

import java.util.List;
import java.util.Optional;

/**
 * 用户仓储接口
 * 操作领域模型 UserModel
 *
 * @author System
 * @version 1.0.0
 * @since 2024-01-01
 */
public interface UserRepository {

    /**
     * 根据ID查询用户
     *
     * @param id 用户ID
     * @return 用户领域模型
     */
    Optional<UserModel> findById(String id);

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户领域模型
     */
    Optional<UserModel> findByUsername(String username);

    /**
     * 根据邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户领域模型
     */
    Optional<UserModel> findByEmail(String email);

    /**
     * 根据手机号查询用户
     *
     * @param phone 手机号
     * @return 用户领域模型
     */
    Optional<UserModel> findByPhone(String phone);

    /**
     * 检查用户名是否存在
     *
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 检查邮箱是否存在
     *
     * @param email 邮箱
     * @return 是否存在
     */
    boolean existsByEmail(String email);

    /**
     * 检查手机号是否存在
     *
     * @param phone 手机号
     * @return 是否存在
     */
    boolean existsByPhone(String phone);

    /**
     * 保存用户
     *
     * @param user 用户领域模型
     * @return 保存后的用户领域模型
     */
    UserModel save(UserModel user);

    /**
     * 根据ID列表查询用户
     *
     * @param ids 用户ID列表
     * @return 用户领域模型列表
     */
    List<UserModel> findByIds(List<String> ids);

    /**
     * 删除用户
     *
     * @param id 用户ID
     */
    void deleteById(String id);
}

